Production-Level Spring Boot Folder Structure
Complete Project Structureโ
project-root/
โโโ src/
โ โโโ main/
โ โ โโโ java/
โ โ โ โโโ com/
โ โ โ โโโ company/
โ โ โ โโโ project/
โ โ โ โโโ ProjectApplication.java
โ โ โ โโโ config/
โ โ โ โโโ controller/
โ โ โ โโโ service/
โ โ โ โโโ repository/
โ โ โ โโโ model/
โ โ โ โโโ dto/
โ โ โ โโโ mapper/
โ โ โ โโโ exception/
โ โ โ โโโ security/
โ โ โ โโโ util/
โ โ โ โโโ validator/
โ โ โ โโโ aspect/
โ โ โ โโโ event/
โ โ โ โโโ constant/
โ โ โโโ resources/
โ โ โโโ application.yml
โ โ โโโ application-dev.yml
โ โ โโโ application-prod.yml
โ โ โโโ application-test.yml
โ โ โโโ db/
โ โ โ โโโ migration/
โ โ โโโ static/
โ โ โโโ templates/
โ โ โโโ i18n/
โ โ โโโ logback-spring.xml
โ โโโ test/
โ โโโ java/
โ โ โโโ com/
โ โ โโโ company/
โ โ โโโ project/
โ โ โโโ controller/
โ โ โโโ service/
โ โ โโโ repository/
โ โ โโโ integration/
โ โ โโโ unit/
โ โโโ resources/
โ โโโ application-test.yml
โโโ docker/
โ โโโ Dockerfile
โ โโโ docker-compose.yml
โ โโโ docker-compose.dev.yml
โโโ docs/
โ โโโ API.md
โ โโโ DEPLOYMENT.md
โ โโโ ARCHITECTURE.md
โโโ scripts/
โ โโโ deploy.sh
โ โโโ backup.sh
โ โโโ healthcheck.sh
โโโ .github/
โ โโโ workflows/
โ โโโ ci.yml
โ โโโ cd.yml
โโโ .gitignore
โโโ README.md
โโโ pom.xml (or build.gradle)
โโโ Dockerfile
โโโ docker-compose.yml
Detailed Layer Breakdownโ
1. Controller Layer (controller/)โ
Handles HTTP requests and responses. Should be thin and delegate business logic to services.
// UserController.java
@RestController
@RequestMapping("/api/v1/users")
@Validated
public class UserController {
// REST endpoints
}
Responsibilities:
- Request/response handling
- Input validation
- HTTP status codes
- Delegating to service layer
Naming Convention: {Entity}Controller.java
2. Service Layer (service/)โ
Contains business logic and orchestrates operations.
service/
โโโ UserService.java (interface)
โโโ impl/
โ โโโ UserServiceImpl.java
โโโ AuthenticationService.java
โโโ EmailService.java
Responsibilities:
- Business logic implementation
- Transaction management
- Service orchestration
- Calling multiple repositories
Best Practices:
- Use interfaces for service contracts
- Keep implementations in
impl/subdirectory - Use
@Transactionalannotations appropriately
3. Repository Layer (repository/)โ
Data access layer using Spring Data JPA or other persistence mechanisms.
// UserRepository.java
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
Optional<User> findByEmail(String email);
List<User> findByStatus(UserStatus status);
}
Responsibilities:
- Database operations
- Custom queries
- Data persistence
Types:
- JPA Repositories
- Custom Repository implementations
- Query methods
4. Model/Entity Layer (model/ or entity/)โ
JPA entities representing database tables.
// User.java
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false, unique = true)
private String email;
// getters, setters, builders
}
Annotations Used:
@Entity,@Table@Id,@GeneratedValue@OneToMany,@ManyToOne, etc.@Column,@JoinColumn
5. DTO Layer (dto/)โ
Data Transfer Objects for API requests and responses.
dto/
โโโ request/
โ โโโ CreateUserRequest.java
โ โโโ UpdateUserRequest.java
โโโ response/
โโโ UserResponse.java
โโโ ApiResponse.java
Purpose:
- Decouple API contract from domain models
- Validation annotations
- Version control of APIs
- Hide sensitive entity data
// CreateUserRequest.java
public class CreateUserRequest {
@NotBlank
@Email
private String email;
@Size(min = 8)
private String password;
}
6. Mapper Layer (mapper/)โ
Converts between entities and DTOs.
// UserMapper.java
@Mapper(componentModel = "spring")
public interface UserMapper {
UserResponse toResponse(User user);
User toEntity(CreateUserRequest request);
List<UserResponse> toResponseList(List<User> users);
}
Options:
- MapStruct (recommended for production)
- Manual mapping
- ModelMapper library
7. Configuration Layer (config/)โ
Application configuration classes.
config/
โโโ SecurityConfig.java
โโโ DatabaseConfig.java
โโโ CacheConfig.java
โโโ AsyncConfig.java
โโโ SwaggerConfig.java
โโโ RestTemplateConfig.java
Common Configurations:
- Security (Spring Security)
- Database (DataSource, JPA)
- Caching (Redis, Caffeine)
- Async processing
- API documentation (Swagger/OpenAPI)
- CORS settings
8. Exception Layer (exception/)โ
Custom exceptions and global exception handling.
exception/
โโโ BusinessException.java
โโโ ResourceNotFoundException.java
โ โโ ValidationException.java
โโโ UnauthorizedException.java
โโโ GlobalExceptionHandler.java
// GlobalExceptionHandler.java
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(ResourceNotFoundException.class)
public ResponseEntity<ErrorResponse> handleNotFound(
ResourceNotFoundException ex) {
return ResponseEntity.status(HttpStatus.NOT_FOUND)
.body(new ErrorResponse(ex.getMessage()));
}
}
9. Security Layer (security/)โ
Authentication and authorization components.
security/
โโโ JwtTokenProvider.java
โโโ JwtAuthenticationFilter.java
โโโ CustomUserDetailsService.java
โโโ SecurityUtils.java
โโโ PasswordEncoderConfig.java
Components:
- JWT token handling
- Custom authentication filters
- User details service
- Security utilities
10. Util Layer (util/)โ
Utility and helper classes.
util/
โโโ DateUtils.java
โโโ StringUtils.java
โโโ ValidationUtils.java
โโโ ResponseBuilder.java
Guidelines:
- Static utility methods
- No business logic
- Reusable across layers
11. Validator Layer (validator/)โ
Custom validation logic.
validator/
โโโ EmailValidator.java
โโโ PhoneNumberValidator.java
โโโ annotation/
โโโ ValidEmail.java
โโโ ValidPhone.java
12. Aspect Layer (aspect/)โ
Cross-cutting concerns using AOP.
aspect/
โโโ LoggingAspect.java
โโโ PerformanceAspect.java
โโโ SecurityAspect.java
Use Cases:
- Logging
- Performance monitoring
- Transaction management
- Security checks
13. Event Layer (event/)โ
Event-driven architecture components.
event/
โโโ UserCreatedEvent.java
โโโ OrderPlacedEvent.java
โโโ listener/
โ โโโ UserEventListener.java
โ โโโ OrderEventListener.java
โโโ publisher/
โโโ EventPublisher.java
14. Constant Layer (constant/)โ
Application constants and enums.
constant/
โโโ AppConstants.java
โโโ ErrorMessages.java
โโโ ApiEndpoints.java
โโโ enums/
โโโ UserStatus.java
โโโ OrderStatus.java
โโโ Role.java
Resources Directory Structureโ
Application Propertiesโ
# application.yml (base configuration)
spring:
application:
name: project-name
profiles:
active: ${ACTIVE_PROFILE:dev}
# application-dev.yml (development)
spring:
datasource:
url: jdbc:postgresql://localhost:5432/devdb
# application-prod.yml (production)
spring:
datasource:
url: ${DB_URL}
username: ${DB_USERNAME}
password: ${DB_PASSWORD}
Database Migrations (db/migration/)โ
Using Flyway or Liquibase:
db/
โโโ migration/
โโโ V1__create_users_table.sql
โโโ V2__create_orders_table.sql
โโโ V3__add_user_status_column.sql
Testing Structureโ
Unit Testsโ
test/
โโโ java/
โโโ com/company/project/
โโโ service/
โ โโโ UserServiceTest.java
โโโ util/
โโโ DateUtilsTest.java
Integration Testsโ
integration/
โโโ UserIntegrationTest.java
โโโ OrderFlowIntegrationTest.java
โโโ config/
โโโ TestConfig.java
Docker Configurationโ
Dockerfileโ
FROM eclipse-temurin:17-jdk-alpine AS build
WORKDIR /workspace/app
COPY mvnw .
COPY .mvn .mvn
COPY pom.xml .
COPY src src
RUN ./mvnw install -DskipTests
FROM eclipse-temurin:17-jre-alpine
VOLUME /tmp
ARG DEPENDENCY=/workspace/app/target/dependency
COPY --from=build ${DEPENDENCY}/BOOT-INF/lib /app/lib
COPY --from=build ${DEPENDENCY}/META-INF /app/META-INF
COPY --from=build ${DEPENDENCY}/BOOT-INF/classes /app
ENTRYPOINT ["java","-cp","app:app/lib/*","com.company.project.ProjectApplication"]
docker-compose.ymlโ
version: '3.8'
services:
app:
build: .
ports:
- "8080:8080"
environment:
- SPRING_PROFILES_ACTIVE=prod
depends_on:
- postgres
- redis
postgres:
image: postgres:15
environment:
POSTGRES_DB: appdb
POSTGRES_USER: user
POSTGRES_PASSWORD: password
volumes:
- postgres_data:/var/lib/postgresql/data
redis:
image: redis:7-alpine
ports:
- "6379:6379"
volumes:
postgres_data:
Best Practices Summaryโ
Package Organizationโ
- Use feature-based or layer-based organization consistently
- Keep packages cohesive and loosely coupled
- Avoid circular dependencies
Naming Conventionsโ
- Controllers:
{Entity}Controller - Services:
{Entity}Serviceand{Entity}ServiceImpl - Repositories:
{Entity}Repository - DTOs:
{Purpose}{Entity}Request/Response
Securityโ
- Never commit secrets to version control
- Use environment variables for sensitive data
- Implement proper authentication and authorization
- Use HTTPS in production
Performanceโ
- Implement caching strategically
- Use connection pooling
- Optimize database queries
- Use async processing for long-running tasks
Monitoringโ
- Implement health checks
- Add application metrics (Micrometer/Prometheus)
- Use structured logging
- Set up alerting
Documentationโ
- Maintain updated README
- Document API using OpenAPI/Swagger
- Keep architecture documentation current
- Add inline comments for complex logic
Additional Production Considerationsโ
CI/CD Pipelineโ
- Automated testing
- Code quality checks (SonarQube)
- Security scanning
- Automated deployment
Monitoring & Loggingโ
- Centralized logging (ELK stack)
- APM tools (New Relic, Datadog)
- Health check endpoints
- Custom metrics
Database Managementโ
- Migration scripts (Flyway/Liquibase)
- Backup strategies
- Read replicas for scaling
- Connection pooling (HikariCP)
API Versioningโ
/api/v1/users
/api/v2/users
Rate Limiting & Throttlingโ
- Implement request rate limiting
- Use API gateway when scaling
This structure provides a solid foundation for building production-ready Spring Boot applications that are maintainable, scalable, and follow industry best practices.